package com.atguigu.spring.aop.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * ---使用cglib进行代理
 * 
 * Cglib代理的引入是为了解决类的直接代理问题（生成代理子类），不需要接口也可以代理，
 *  -- 该代理方式需要相应的jar包，但不需要导入。
 *  --因为Spring core包已经包含cglib,而且同时包含了cglib依赖的asm的包
 * 
 * 
 * @author handy
 *
 */
public class CglibProxyFactory implements MethodInterceptor{
	
	private Object target;
	
	public CglibProxyFactory(Object target) {
		this.target = target;
	}
	
	public Object getProxyObject() {
		
		//代理对象生成器
		Enhancer enhancer = new Enhancer();
		//设置目标对象
		enhancer.setSuperclass(target.getClass());
		//设置回调函数	
		enhancer.setCallback(this);
		//创建返回代理对象
		Object objecyt = enhancer.create();
		
		return objecyt;
	}

	/**回调方法（代理对象的方法）
	 * proxy  代理对象
	 * method  目标对象的方法对象
	 * args 目标对象方法参数的值
	 * methodProxy 代理对象的方法对象
	 * 
	 */
	
	@Override
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		
		/*if (method.getName().equals("add")) {
			writelog(method.getName());
		}*/
		
		
		String name = method.getName();
		writelog(name);
		
		//目标对象原来方法的执行
		Object object = method.invoke(target, args);
		System.out.println("计算结果是：" + object);
		return object;
	}
	
	public static void writelog(String param) {
		System.out.println("测试代理的方法:" + param );
	}

	
}
